package com.ihr360.payroll.service.salaryplan;

import com.ihr360.commons.request.Ihr360SearchBody;
import com.ihr360.payroll.model.dto.salary.plan.SalaryPlan;
import com.ihr360.payroll.model.dto.salary.plan.config.PayslipConfig;
import com.ihr360.payroll.model.vo.SalaryFieldVo;
import com.ihr360.rest.service.SimpleRestService;
import org.springframework.data.domain.Page;

import java.util.List;

/**
 * @author tomtao
 */
public interface SalaryPlanService extends SimpleRestService<SalaryPlan, Long> {
    /**
     * 将员工将入薪资计划
     *
     * @param staffIds
     * @param planId
     * @return
     */
    boolean addStaffsToPlan(List<String> staffIds, Long planId);

    /**
     * 将员工从薪资计划计划中移除
     *
     * @param staffIds
     * @param planId
     * @return
     */
    boolean removeStaffsFromPlan(List<String> staffIds, Long planId);

    /**
     * 获取方案中的员工列表
     *
     * @param planId
     * @return
     */
    List<String> getStaffsInPlan(Long planId);

    /**
     * 保存工资表
     *
     * @param planId
     * @param payslipConfig
     * @return
     */
    PayslipConfig savePayslipConfig(Long planId, PayslipConfig payslipConfig);

    /**
     * 获取薪资方案中的全部有效薪资字段
     * note：不需要权限限制
     *
     * @param planId
     * @return
     */
    List<SalaryFieldVo> getPlanSalaryFieldsWithOutAuth(Long planId);

    /**
     * 获取薪资方案中的全部有效薪资字段
     *
     * @param planId
     * @return
     */
    List<SalaryFieldVo> getPlanSalaryFields(Long planId);

    /**
     * 获取薪资方案中的全部有效输入项类型的薪资字段
     *
     * @param planId
     * @return
     */
    List<SalaryFieldVo> getPlanInputSalaryFields(Long planId);

    /**
     * 判断方案是否在帐期限内
     *
     * @param companyId
     * @param salaryPlanId
     * @return
     */
    boolean isPayPeriod(String companyId, Long salaryPlanId);

    /**
     * 删除
     *
     * @param id
     * @return
     */
    boolean deleteById(Long id);

    /**
     * Ａ端删除
     *
     * @param id
     * @return
     */
    boolean deleteSystemTemplateById(Long id);

    /**
     * 获取默认工资单配置
     *
     * @param salaryPlanId
     * @return
     */
    PayslipConfig getDefaultPayslipConfig(Long salaryPlanId);

    /**
     * 保存
     *
     * @param salaryPlan
     * @return
     */
    SalaryPlan save(SalaryPlan salaryPlan);

    /**
     * 保存系统模板
     *
     * @param salaryPlan
     * @return
     */
    SalaryPlan saveSystemTemplate(SalaryPlan salaryPlan);


    /**
     * 获取一条系统模板数据
     *
     * @param id
     * @return
     */
    SalaryPlan getOneSystemTemplate(Long id);


    /**
     * 获取一条数据，系统模板不需认证权限
     *
     * @param id
     * @return
     */
    SalaryPlan getOneContainSystemTemplate(Long id);

    /**
     * 获取公司所有包含模板数据
     *
     * @param searchBody
     * @return
     */
    List<SalaryPlan> getAllInCompanyContainSystemTemplate();

    /**
     * 查询系统模板列表
     *
     * @param searchBody
     * @return
     */
    Page<SalaryPlan> searchSystemTemplate(Ihr360SearchBody<SalaryPlan> searchBody);

    /**
     * 验证名称是否重复
     *
     * @param name
     * @param id
     * @return
     */
    boolean isDuplicateName(String name, Long id);

    /**
     * 验证系统模板名称是否重复
     *
     * @param name
     * @param id
     * @return
     */
    boolean isDuplicateNameSystemTemplate(String name, Long id);

    /**
     * 创建默认工资单
     *
     * @param salaryPlan
     * @return
     */
    SalaryPlan createDefaultPayslipConfig(Long id);

    /**
     * 克隆方案
     *
     * @param id
     * @return
     */
    SalaryPlan cloneSalaryPlan(Long id);

    /**
     * 获取薪资方案列表
     *
     * @param salaryPlanIdList
     * @return
     * */
    List<SalaryPlan> getCompanySalaryPlan(List<Long> salaryPlanIdList);

    /**
     * 获取系统模板Id
     *
     * @return
     */
    List<Long> getSystemTemplateIdList();
}
